# 利用中点算法绘制一个半径为100，圆心为(10,20)的圆，要求坐标原点为画布中心。

import numpy as np
import matplotlib.pyplot as plt

width = 300
height = 300


def axis_shift(x, y):
    # 到坐标原点
    x = x + width // 2
    y = height // 2 - y
    return x, y


def draw(img, points, color=(255, 255, 255)):
    for (x, y) in points:
        x0, y0 = axis_shift(x, y)
        img[y0, x0, :] = color
    return img


def MPCycle(r):
    """
    绘制以0，0为圆心的圆
    """
    points = []
    e = 1 - r
    x, y = 0, r
    while x<=y:
        points.append((x, y))
        # 对称性，把其他8个子象限的点也找到
        points.append((y, x))
        points.append((-x, y))
        points.append((-y, x))
        points.append((x, -y))
        points.append((y, -x))
        points.append((-x, -y))
        points.append((-y, -x))

        if e<0:
            e += 2*x+3
        else:
            e += 2*(x-y)+5
            y -= 1

        x += 1

    return points


# 加载或创建一个图像
img = np.zeros((height, width, 3), dtype=np.uint8)  # 创建一个256x256的黑色画布

# 绘制线段
r = 100
points = MPCycle(r)

# 所有点平移(10,20)
p = []
for (x, y) in points:
    p.append((x+10, y+20))

img = draw(img, p, (255, 0, 255))


# 显示图像
plt.imshow(img)
plt.show()
